/**
 * 懒汉式单例模式
 * */
class Singletonlazy{
    private static volatile Singletonlazy instance;//使用volatile关键字，防止指令重排序,保证线程安全

    private Singletonlazy(){//私有构造方法，防止外部实例化
    }

    public static Singletonlazy getInstance(){
        //双重检查锁定，提高线程安全性和性能
        if(instance==null){//第一次检查，避免不必要的同步
            synchronized (Singletonlazy.class){//同步锁
                if(instance==null){//第二次检查，确保实例未被创建
                    instance=new Singletonlazy();//创建实例
                }
            }
        }
        return instance;
    }
}
public class demo2 {
        public static void main(String[] args) throws InterruptedException {
            Thread[] threads=new Thread[10];
            Singletonlazy[] instances=new Singletonlazy[10];
            //创建多个线程，模拟多线程环境
            for(int i=0;i<10;i++) {
                final int index = i;
                threads[i] = new Thread(() -> {
                    instances[index] = Singletonlazy.getInstance();
                    System.out.println("线程" + Thread.currentThread().getName() + "获取的实例地址：" + instances[index]);

                });
            }
            for(Thread thread:threads) {//启动所有线程
                thread.start();
            }
            for(Thread thread:threads) {//等待所有线程结束
                thread.join();
            }
            //检查是否所有线程获取的实例地址相同
            boolean allSame=true;
            for(int i=1;i<10;i++) {
                if(instances[0]!=instances[i]) {
                    allSame=false;
                    break;
                }
            }
            System.out.println("所有实例都相同:"+allSame);
            if(!allSame) {
                System.out.println("说明LazySingleton在多线程环境下是不安全的");
            }
        }
}
